package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法   关键字：abstract
 * 类：只能提供行为概念，没有具体实现行为
 *
 * 抽象类与面向对象---多态绝对关系
 * 使用多态创建抽象对象，抽象类本身无法创建对象，【借助多态】
 *
 * 什么是使用抽象类？
 * 复杂项目时，需要在不同类下实现不同的功能，首先抽象类【Android常用】
 *
 * 定义抽象类与抽象方法？
 * 抽象类：修饰符 abstract class 类名{}---------------毫无意义，必须结合抽象方法
 * 抽象方法：修饰符 返回值 方法名（参数）；-----无具体的实现
 *
 *
 * 抽象类“实例化：创建对象”：抽象类自身无法实现实例化
 * ①创建【N个】子类，继承抽象【父类】，子类一定实现抽象【父类】的所有抽象方法
 * ②使用面向对象：多态【向上造型】  抽象类 引用=new 【实现】子类（）；
 * 注意：抽象类一定发生重写，子类继承【父类】，也可以叫做“实现类”！
 */
abstract class Animals{ //抽象类：
    //抽象方法:没有具体实线框：{}------一定继承-----一定多态性【造型】
    public abstract void say();
    //①定义由final修饰的抽象方法？----错误
        //  public final  abstract void sleep();
    //②定义抽象变量？----错误
        //  abstract int i=1;
    //③定义静态变量？----正确
        static int i=1;
    //④定义静态的抽象变量？----错误
        //  static abstract int j=1;
    //⑤定义静态的抽象方法【无实现】？----错误
        //  public static abstract void eat();
    //⑥定义静态方法【无实现：空的代码块】？----正确
        public static void eat(){};
//总结：⑤⑥抽象方法|静态方法，方法定义：修饰符static|abstract 返回值 方法名
    //⑦定义内部类（静态）？----正确
        static class Sos{}
    //⑧抽象类有构造器？----正确
        public Animals() {}
    //⑨抽象类可以有普通实现方法？----正确
        public void run(){}
    //⑩抽象类可以继承抽象类？ 实现：两个抽象类--形容一个实现----正确
    abstract class Thing extends Animals{
            public abstract void sleep();
    }
         //m目的：两个抽象类中所有抽象方法
}
//实现类：实现抽象【父】类的方法----多个实现类---继承---抽象
class Person1 extends Animals{   //报错原因：重写
    @Override
    public void say() {
        System.out.println("人---说话~");
    }

}
public class 抽象类 {
    public static void main(String[] args){
        //抽象类无法实现类：提供抽象方法---必须由子类实现---多态创建抽象类【造型】
        Animals a=new Person1();
        a.say();//向上造型---重写：抽象【父】类抽象类方法【覆盖】

    }
}
























